fn main() {
	// bool_t()
	// num_t()
	// byte_t()
	// str_t()
	rune_t()
}

// 布尔
fn bool_t() {
	x := true
	y := false

	println('x: ${x}, y: ${y}')
	println(sizeof(bool)) // 1字节
}

// 数字
fn num_t() {
	mut i := 0x0 // 十六进制
	println(i)
	i = 0b10 // 二进制
	println(i)
	i = 1_000 // 十进制
	println(i)

	x := 1
	y := 2.3
	println(typeof(x).name)
	println(typeof(y).name)

	xx := u32(1)
	yy := f32(2.3)
	println(typeof(xx).name)
	println(typeof(yy).name)
}

// 字节，就是 u8
fn byte_t() {
	b := u8(65)
	println(b.str()) // 65
	println(b.ascii_str()) // A
}

// 字符串
fn str_t() {
	a := 'abc'
	b := 'xyz'

	println('字符长度（a.len）：${a.len}')

	// 拼接
	c := a + b
	println('字符拼接（a + b）：${c}')

	// 追加
	mut s := 'Hello, '
	s += '世界'
	println('字符追加（mut s += ）：${s}')

	// 是否包含子串
	println('是否包含字串（s.contains("世界")）：${s.contains('世界')}')

	// 遍历
	for ss in s {
		println(ss.str())
	}

	// 遍历索引和值
	for idx, val in s {
		println('idx: ${idx}, val: ${val.str()}')
	}

	// 切片
	str := 'hello_world'
	println('str[..3]：${str[..3]}')
	println('str[2..]：${str[2..]}')
	println('str[2..5]：${str[2..5]}')
	println('str#[2..-1]：${str#[2..-1]}') // 如果有负数，需要加上 #
	println('str#[-5..-1]：${str#[-5..-1]}')

	// 越界处理
	println(str[..str.len + 1] or { '越界了' })
	println(check_range(str) or { '又越界了' })

	// 原始字符串
	raw_s := r'原始字符串 ${str}'
	println(raw_s)
}

fn check_range(s string) !string {
	return s[..20]!
}


// rune, u32 的别名
// 使用反引号 ` 来定义
fn rune_t() {
	ch := `中`
	println('typeof: ${typeof(ch).name}, sizeof: ${sizeof(ch)}, int(ch): ${int(ch)}, ch: ${ch}')
}